package com.example.hystrix;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import net.minidev.json.JSONUtil;
import org.w3c.dom.ls.LSOutput;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;

import java.util.concurrent.ExecutionException;

public class TestHystrixCommand {


    public static void main(String[] args) throws ExecutionException, InterruptedException {

        /**
         * 1,execute()
         * 同步执行，从依赖的服务返回一个单一的结果对象，或是在发生错误是抛出异常
         */
        //System.out.println(new CommandHelloWorld("evan").execute());

        /**
         * 2.queue()
         * 异步执行，直接返回一个Future对象，其中包含了服务结束时要返回的单一结果对象
         */
        //System.out.println(new CommandHelloWorld("evan").queue().get());


        /**
         * 3,observe()
         * 返回的是Hot Observable,HotObservable，不论 “事件源” 是否有“订阅者”
         * 都会在创建后对事件进行发布。所以对于Hot Observable的每一个“订阅者”都有
         * 可能从“事件源”的中途开始的，并可能只是看到了整个操作的局部过程
         */
        Observable<String> ob=new CommandHelloWorld("evan test").observe();
        ob.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                System.out.println("observe() completed");
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("observe() issue"+ throwable.getMessage());
            }

            @Override
            public void onNext(String s) {
                System.out.println("observe() "+s);
            }
        });
        ob.subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println("action1 observe（） "+s);
            }
        });
        Thread.currentThread().join();


        /**
         * 4, toObervable()
         * 只能有一个订阅者，如果同时被两个订阅者，就会报 command executed multiple times - this is not permitted
         * Clod Observable 在没有 “订阅者” 的时候并不会发布数据
         *而是进行等待，知道有订阅者 之后才会发布数据，所以对于
         * cold Observable 的订阅者，它可以保证从一开始看到整个操作的全过程
         *
         */
        Observable<String> ob1=new CommandHelloWorld("evan test").toObservable();
        ob1.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                System.out.println("observable() completed");
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("observable() issue"+ throwable.getMessage());
            }

            @Override
            public void onNext(String s) {
                System.out.println("observable() "+s);
            }
        });
        Thread.currentThread().join();

    }

}
